import { loadUserBasicInfoBySidAPI } from 'api/base/user';
// import cookies from '@/utils/cookies.js';
import { getSid } from 'common/auth';

import { isUndefined } from 'utils/validate/data';

// /**************************************************
//  * 跟当前登录用户有关的数据都在此处设置。
//  *  【重要】 其他用户的信息请不要使用此state
//  * 包含
//  * -- 用户的基本信息
//  * -- 用户登录的 sid
//  *
//  **************************************************/

//  用户基本信息
const USER_BASE_INFO = ['userId', 'nickName', 'avatar', 'wechatOpenid'];
// 用户的详细信息
const USER_DETAIL_INFO = USER_BASE_INFO.concat(['age', 'sex', 'address', 'email', 'birthdate']);

const state = {
  // 初始化从cookie中获取用户的sid 数据
  sid: getSid(),
  // 当前用户基本信息是否已经加载
  isLoadedBasicInfo: false,
};
let getters = {
  g_sid(state) {
    return state.sid;
  },
  g_isLoadedBasicInfo(state) {
    return !!state.isLoadedBasicInfo;
  },
};

const mutations = {
  s_sid(state, sid) {
    state.sid = sid;
    cookies.set('sid', sid);
  },
  s_isLoadedBasicInfo(state, isLoadedBasicInfo) {
    state.isLoadedBasicInfo = !!isLoadedBasicInfo;
  },
};

// 初始化用户基本信息和详情信息的 getter和mutation方法
(array => {
  // 初始化 state
  array.forEach(key => {
    state[`${key}`] = undefined;
  });

  array.forEach(key => {
    getters[`g_${key}`] = state => {
      return state[key];
    };
  });
  array.forEach(key => {
    mutations[`s_${key}`] = (state, value) => {
      state[key] = value;
    };
  });
})(USER_DETAIL_INFO);

const actions = {
  /**
   * 用户登录以后 初始化加载 系统数据 包含：
   * -- 用户的基本信息
   * -- 用户的页面权限
   * @param {*} param0
   */
  load({ state, dispatch }) {
    let userinfo = null;
    return new Promise(async (resolve, reject) => {
      try {
        // 加载用户的基本信息
        userinfo = await dispatch(
          'base/user/loadUserBasicInfo',
          {},
          {
            root: true,
          }
        );
        // 持久化当前用户信息
        await dispatch('base/user/set', userinfo, {
          root: true,
        });
        resolve(userinfo);
      } catch (error) {
        reject({
          ...userinfo,
        });
      }
    });
  },
  /**
   * 移除用户的基本数据
   */
  destroy({ state, dispatch }) {
    return new Promise(async resolve => {
      // 清除用户的基本信息
      state.sid = '';
      // cookie中关键数据移除
      cookies.remove('sid');
      cookies.remove('user');
      resolve();
    });
  },

  /**
   * 加载用户的基本信息
   *  这是根据SID去获取当前用户的基本信息的
   *  在进入每一个页面的时候如果当前信息不存在都会默认加载一下用户的基本信息
   */
  loadUserBasicInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      loadUserBasicInfoBySidAPI()
        .then(({ respCode, respMsg, result }) => {
          // 加载用户的基本信息失败
          if (respCode != '0') {
            return reject({
              respCode,
              respMsg,
              result,
            });
          }

          resolve(result);
        })
        .catch(error => {
          reject(error);
        });
    });
  },

  /**
   * 根据ID获取用户的详细信息
   *  当前用户的大部分信息不应该再基本信息获取接口中获取到，但是有些时候我们需要加载当前用户的一下其他信息 那么就需要使用这个接口
   * @param {*} param0
   * @param {*} userId
   */
  loadUserBasicExtendInfo({ commit, state }, userId) {
    let params = {
      userId,
    };
    return new Promise((resolve, reject) => {
      loadUserBasinfoByIdAPI(params)
        .then(({ respCode, respMsg, result }) => {
          // 加载用户的基本信息失败
          if (respCode != '0') {
            return reject({
              respCode,
              respMsg,
              result,
            });
          }
          // 将当前用户的基本信息保持到state
          Object.keys(state).forEach(key => {
            if (!isUndefined(result[key])) {
              commit(`s_${key}`, result[key]);
            }
          });
          resolve(result);
        })
        .catch(error => {
          reject(error);
        });
    });
  },

  /**
   * 持久化用户的信息
   */
  set({ state, dispatch, commit }, info) {
    return new Promise(async resolve => {
      // 将当前用户的基本信息保持到state
      Object.keys(state).forEach(key => {
        if (!isUndefined(info[key])) {
          commit(`s_${key}`, info[key]);
        }
      });
      // 设置已经加载过当前用户的基本信息
      commit('s_isLoadedBasicInfo', true);
      // 持久化
      // await dispatch(
      //   'base/db/set',
      //   {
      //     dbName: 'sys',
      //     path: 'user.info',
      //     value: info,
      //     user: true,
      //   },
      //   { root: true }
      // );
      // end
      resolve();
    });
  },
};

// 导出用户
export default {
  namespaced: true,
  state: state,
  getters: getters,
  mutations: mutations,
  actions: actions,
};
